package com.wpp;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.junit.Test;

import javax.sql.DataSource;
import java.beans.PropertyVetoException;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;

/*
 * 数据库连接池VS普通连接
 *   普通连接：每次都要把conn加载到内存中验证用户名和密码，浪费大量的时间及资源
 *           每次使用完之后都会断开，如果出现异常而未能成功关闭，将会导致数据库内存泄漏
 *           这种开发不能控制被创建对象的连接数，系统资源会被毫无顾忌的分配出去。如果连接过多，会导致内存泄漏
 *   数据库连接池
 *           基本思想为数据库连接建立一个缓冲池，预先在缓冲池中放入一定数量的连接，当需要建立数据库连接时，只需要在缓冲池中取出一个，使用完毕在放回去
 *           数据库连接池负责分配、管理和释放数据库连接，它允许应用程序重复使用一个现有的数据库连接，而不是重新建立一个
 *           如果连接池中连接不够用，这些请求将加入到等待队列中
 *
 *   常用的三种数据库连接池
 *       DBCP:是Apache提供的数据库连接池，tomcat服务器自带dbcp数据库连接池，速度相对于c3p0快，但是自身存在BUG，Hibernate3已不再提供支持
 *       C3P0:开源组织提供的数据库连接池，速度相对较慢，但是稳定性可以，hibernate官方推荐使用
 *       Druid:是阿里提供的数据库连接池。即兼备了稳定性，速度也还行。
 *
 *
 *
 * */
public class SqlConnPool {

    /*
     * c3p0测试
     *
     *
     * */
    @Test
    public void c3p0Test() throws Exception {
        //方式一
        //获取c3p0数据库连接池
        ComboPooledDataSource cpds = new ComboPooledDataSource();
        cpds.setDriverClass("com.mysql.cj.jdbc.Driver");
        cpds.setUser("root");
        cpds.setPassword("wpy581");
        cpds.setJdbcUrl("jdbc:mysql://localhost:3306/books?serverTimezone=GMT");
        //设置初始时数据库连接池中的连接数
        cpds.setInitialPoolSize(10);

        Connection connection = cpds.getConnection();
        System.out.println(connection);

    }

    //方式二
    //使用配置文件


    //为什么要放在外面，因为避免每次调用的时候都创建一个数据库连接池，
    private static ComboPooledDataSource cpds = new ComboPooledDataSource("hellc3p0");

    public static Connection getConncetion() throws Exception {
        Connection connection = cpds.getConnection();
        return connection;
    }


    /*
     * dbcp数据库连接池技术
     *
     *
     * */
    @Test
    public void test3() {

        //创建了DBCP的数据库连接池方式一
        // BasicDataSource source = new BasicDataSource();


        //设置基本信息
        //source.setDriverClassName()
        //source.setUrl()
        //source.setUsername()
        //source.setPassword()

        //获取连接
        //Connection conn = source.getConnection();


    }

    @Test
    public void test4() throws IOException {

        //使用静态代码块
        //创建了DBCP的数据库连接池方式二
        //使用配置文件
        Properties properties = new Properties();
        InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("dbcp.properties");
        properties.load(is);

        //DataSource source = BasicDataSourceFactory.createDataSource(properties);

        //获取连接
        //Connection conn = source.getConnection();

    }


    @Test
    public void test5() throws IOException {

        //使用静态代码块
        //创建了Druid的数据库连接池方式一
        //使用配置文件
        Properties properties = new Properties();
        InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("druid.properties");
        properties.load(is);

        //DataSource source = DruidDataSourceFactory.createDataSource(properties);

        //获取连接
        //Connection conn = source.getConnection();

    }

}
